import java.util.ArrayList;
import java.util.List;

/**
 * 7. 整数反转
 * https://leetcode-cn.com/problems/reverse-integer/
 */
public class Solutions_7 {
    public static void main(String[] args) {
        int x1 = 123;  // output: 321
        int x2 = -123;  // output: -321
        int x3 = 120;  // output: 21
        int x4 = 0;  // output: 0
        int x5 = Integer.MAX_VALUE;  // output: 0
        int x6 = Integer.MIN_VALUE;  // output: 0

        List<Integer> inputs = new ArrayList<>();
        inputs.add(x1);
        inputs.add(x2);
        inputs.add(x3);
        inputs.add(x4);
        inputs.add(x5);
        inputs.add(x6);

        for (int input : inputs) {
            int result = reverse(input);
            System.out.println(result);
        }
    }

    // 解法二：用 int 型存储
    public static int reverse(int x) {
        int res = 0;
        int min = Integer.MIN_VALUE, max = Integer.MAX_VALUE;
        while (x != 0) {
            int mod = x % 10;
            // max：-2147483648
            // min：2147483647
            if (x < 0) {
                // res * 10 + mod 后，将小于 min
                if (res < min / 10) {
                    return 0;
                }
                if (res == min / 10 && mod < -8) {
                    return 0;
                }
            }
            if (x > 0) {
                // res * 10 + mod 后，将大于 min
                if (res > max / 10) {
                    return 0;
                }
                if (res == max / 10 && mod > 7) {
                    return 0;
                }
            }
            // 判断是否越界
            res = res * 10 + mod;
            x /= 10;
        }
        return res;
    }

    // 解法一：用 long 型存储
    public static int reverse2(int x) {
        long res = 0;
        while (x != 0) {
            // 负数取余后，余数也是负数
            res = res * 10 + (x % 10);
            x /= 10;
        }
        if (res > Integer.MAX_VALUE || res < Integer.MIN_VALUE) {
            return 0;
        }
        return (int) res;
    }
}
